package FunctionRewrite;
class Animal{
    public void move(){
        System.out.println("动物都会移动 ！");
    }
}
class  Dog extends Animal{
    public void move() {
        System.out.println("狗会跑和走");
    }
    public  void bark(){
        System.out.print("狗可以吠叫");
    }
}
public class Main {
    public  static void main(String[] args){
        //System.out.print("Hello World !");
        Animal a=new Animal();//调用Animal方法来实例化对象a
        Dog b=new Dog();//调用Dog方法来实例化对象b
        a.move();//调用Animal里面的move方法
        b.move();//调用Dog里面的move方法
        b.bark();//因为b的引用类型Animal没有bark方法。 引用Animal类型没有bark（）方法
    }
}
/*
* 在上面的例子中可以看到，尽管 b 属于 Animal 类型，但是它运行的是 Dog 类的 move方法。

这是由于在编译阶段，只是检查参数的引用类型。

然而在运行时，Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。

因此在上面的例子中，之所以能编译成功，是因为 Animal 类中存在 move 方法，然而运行时，运行的是特定对象的方法。*/